Agent technology enhances the ability of Software engineers to develop open, complex and distributed applications and now an increasing number of problems in industrial, commercial, medical and Networking application domains are being solved by agent-based solutions. In developing these solutions, practitioners need appropriate methods, techniques and tools. In this paper, we introduce and justify agent-oriented Software engineering as a layered technology. The layers of this technology are quality, agent oriented Software development process, agent-oriented methods, agent-based system architecture and agent development tools. This pragmatic approach will help developers and project managers to remove many pitfalls of agent-oriented Software development, helps researchers to determine the existing gaps in the current works and helps tool developers to organize their efforts for constructing agent-based tools. On the basis of this approach, an investigation on the current works in agent-oriented Software engineering is presented. In this paper, umbrella activities for complementing the main activities and steps in the agent based development are introduced and described and a new classification and definition of testing activities for agent based systems is presented.